| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108 |
1
| function captureUncaughtExceptions(window, handler, shim) {
if (!window) { return; }
var oldOnError;
if (typeof handler._rollbarOldOnError === 'function') {
oldOnError = handler._rollbarOldOnError;
} else if (window.onerror && !window.onerror.belongsToShim) {
oldOnError = window.onerror;
handler._rollbarOldOnError = oldOnError;
}
var fn = function() {
var args = Array.prototype.slice.call(arguments, 0);
_rollbarWindowOnError(window, handler, oldOnError, args);
};
fn.belongsToShim = shim;
window.onerror = fn;
}
function _rollbarWindowOnError(window, r, old, args) {
if (window._rollbarWrappedError) {
if (!args[4]) {
args[4] = window._rollbarWrappedError;
}
if (!args[5]) {
args[5] = window._rollbarWrappedError._rollbarContext;
}
window._rollbarWrappedError = null;
}
r.handleUncaughtException.apply(r, args);
if (old) {
old.apply(window, args);
}
}
function captureUnhandledRejections(window, handler, shim) {
if (!window) { return; }
if (typeof window._rollbarURH === 'function' && window._rollbarURH.belongsToShim) {
window.removeEventListener('unhandledrejection', window._rollbarURH);
}
var rejectionHandler = function (event) {
var reason = event.reason;
var promise = event.promise;
var detail = event.detail;
if (!reason && detail) {
reason = detail.reason;
promise = detail.promise;
}
if (handler && handler.handleUnhandledRejection) {
handler.handleUnhandledRejection(reason, promise);
}
};
rejectionHandler.belongsToShim = shim;
window._rollbarURH = rejectionHandler;
window.addEventListener('unhandledrejection', rejectionHandler);
}
function wrapGlobals(window, handler, shim) {
if (!window) { return; }
// Adapted from https://github.com/bugsnag/bugsnag-js
var globals = 'EventTarget,Window,Node,ApplicationCache,AudioTrackList,ChannelMergerNode,CryptoOperation,EventSource,FileReader,HTMLUnknownElement,IDBDatabase,IDBRequest,IDBTransaction,KeyOperation,MediaController,MessagePort,ModalWindow,Notification,SVGElementInstance,Screen,TextTrack,TextTrackCue,TextTrackList,WebSocket,WebSocketWorker,Worker,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload'.split(',');
var i, global;
for (i = 0; i < globals.length; ++i) {
global = globals[i];
if (window[global] && window[global].prototype) {
_extendListenerPrototype(handler, window[global].prototype, shim);
}
}
}
function _extendListenerPrototype(handler, prototype, shim) {
if (prototype.hasOwnProperty && prototype.hasOwnProperty('addEventListener')) {
var oldAddEventListener = prototype.addEventListener;
while (oldAddEventListener._rollbarOldAdd && oldAddEventListener.belongsToShim) {
oldAddEventListener = oldAddEventListener._rollbarOldAdd;
}
var addFn = function(event, callback, bubble) {
oldAddEventListener.call(this, event, handler.wrap(callback), bubble);
};
addFn._rollbarOldAdd = oldAddEventListener;
addFn.belongsToShim = shim;
prototype.addEventListener = addFn;
var oldRemoveEventListener = prototype.removeEventListener;
while (oldRemoveEventListener._rollbarOldRemove && oldRemoveEventListener.belongsToShim) {
oldRemoveEventListener = oldRemoveEventListener._rollbarOldRemove;
}
var removeFn = function(event, callback, bubble) {
oldRemoveEventListener.call(this, event, callback && callback._rollbar_wrapped || callback, bubble);
};
removeFn._rollbarOldRemove = oldRemoveEventListener;
removeFn.belongsToShim = shim;
prototype.removeEventListener = removeFn;
}
}
module.exports = {
captureUncaughtExceptions: captureUncaughtExceptions,
captureUnhandledRejections: captureUnhandledRejections,
wrapGlobals: wrapGlobals
};
|